/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.unal.ahnmodeler.view;

import co.edu.unal.ahnmodeler.main.App;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Clase que representa el contenedor de la barra de estado de la aplicación.
 * Permite visualizar: 1: Número total de nodos en la red Ad-Hoc en un instante
 * de tiempo determinado. 2: Número total de conexiones existentes entre los
 * nodos que conforman la red Ad-Hoc en un instante de tiempo determinado. 3:
 * Tiempo transcurrido de la simulación.
 *
 * @author Phelipe
 */
public class StatusBar extends javax.swing.JPanel implements Runnable {

    private static StatusBar INSTANCE = null;

    // creador sincronizado para protegerse de posibles problemas  multi-hilo
    // otra prueba para evitar instanciación múltiple 
    private synchronized static void createInstance() {
        if (INSTANCE == null) {
            INSTANCE = new StatusBar();
        }
    }

    /**
     * Permite obtener la instancia de la clase que representa el contenedor de
     * la barra de estado de la aplicación.
     *
     * @return Instancia de la clase que representa el contenedor de la barra de
     * estado de la aplicación.
     */
    public static StatusBar getInstance() {
        createInstance();
        return INSTANCE;
    }

    /**
     * Creates new form StatusBar
     */
    private StatusBar() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        LStatus = new javax.swing.JLabel();
        LTimeSimu = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jSeparator1 = new javax.swing.JSeparator();
        LNumCon = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        LNumNodes = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();

        setPreferredSize(new java.awt.Dimension(500, 20));

        LStatus.setText("Aplicación iniciada");

        LTimeSimu.setText("00:00:00");

        jLabel3.setText("Tiempo de Simulación:");

        jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);

        LNumCon.setText("00000");

        jLabel5.setText("Conexiones:");

        LNumNodes.setText("000");

        jLabel7.setText("Nodos:");

        jLabel8.setText("Estado:");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel8)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(LStatus)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jLabel7)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(LNumNodes)
                .addGap(18, 18, 18)
                .addComponent(jLabel5)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(LNumCon)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel3)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(LTimeSimu)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(LStatus, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(LTimeSimu, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(LNumCon)
                .addComponent(jLabel5)
                .addComponent(LNumNodes)
                .addComponent(jLabel7)
                .addComponent(jLabel8))
            .addComponent(jSeparator1)
        );
    }// </editor-fold>//GEN-END:initComponents
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel LNumCon;
    private javax.swing.JLabel LNumNodes;
    private javax.swing.JLabel LStatus;
    private javax.swing.JLabel LTimeSimu;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JSeparator jSeparator1;
    // End of variables declaration//GEN-END:variables

    @Override
    public void run() {
        int cont = 0;
        int seg = 0;
        int min = 0;
        int hour = 0;
        int nNod = 0;
        int nCon = 0;
        while (running) {
            nNod = App.getNetwork().getNumNodes();
            nCon = App.getNetwork().getNumCon();
            LNumNodes.setText(nNod + ".");
            LNumCon.setText(nCon + ".");
            LTimeSimu.setText(((hour < 10) ? "0" : "") + hour + ":" + ((min < 10) ? "0" : "") + min + ":" + ((seg < 10) ? "0" : "") + seg);
            try {
                Thread.sleep(100);
                if (cont < 10) {
                    cont++;
                } else {
                    cont = 0;
                    if (seg < 59) {
                        seg++;
                    } else {
                        seg = 0;
                        if (min < 59) {
                            min++;
                        } else {
                            min = 0;
                            hour++;
                        }
                    }
                }
            } catch (InterruptedException ex) {
                Logger.getLogger(StatusBar.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    /**
     * Permite determinar si existe una simulación en ejecución.
     *
     * @return Si existe una simulación en ejecución.
     */
    public boolean isRunning() {
        return running;
    }

    /**
     * Permite asignar a la barra de estado de la aplicación si existe una
     * simulación en ejecución.
     *
     * @param running Valor que indica si existe una simulación en ejecución.
     */
    public void setRunning(boolean running) {
        this.running = running;
    }

    /**
     * Permite obtener el valor de la barra de estado de la aplicación.
     * @param status Estado de la barra de estado de la aplicación.
     */
    public void setStatus(String status) {
        LStatus.setText(status);
    }
    private boolean running;
}
